package org.dromara.common.redis.handler;

import cn.hutool.http.HttpStatus;
import com.baomidou.lock.exception.LockFailureException;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：Redis异常处理器
 */
@Slf4j
@RestControllerAdvice
public class RedisExceptionHandler {

    /**
     * 分布式锁Lock4j异常
     * 处理锁失败异常
     * 当出现LockFailureException时，此方法被调用以记录错误并返回一个失败的响应对象
     *
     * @param e 锁失败异常对象，包含错误的详细信息和原因
     * @param request HTTP请求对象，用于获取当前请求的URI
     * @return 返回一个R类型的对象，其中包含错误码和错误消息，在这里用于指示业务处理中出现的锁失败异常
     *
     * 注意：此方法主要用于统一处理无法获取分布式锁时的异常情况，以确保系统稳定性和用户得到明确的错误反馈
     */
    /**
     * 处理LockFailureException异常的方法
     * 当系统检测到锁失败时，会抛出此异常，该方法用于捕获并处理该异常
     *
     * @return 重定向到错误页面，用于展示锁失败的错误信息
     */
    @ExceptionHandler(LockFailureException.class)
    public R<Void> handleLockFailureException(LockFailureException e, HttpServletRequest request) {
        // 获取当前请求的URI
        String requestURI = request.getRequestURI();
        log.error("获取锁失败了'{}',发生Lock4j异常.", requestURI, e);
        // 返回一个表示失败的响应对象，包含错误码和错误消息
        return R.fail(HttpStatus.HTTP_UNAVAILABLE, "业务处理中，请稍后再试...");
    }

}
